home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / BASIC / 0007.ZIP / LORES.ASM < prev    next >
Assembly Source File  |  1984-03-21  |  47KB  |  1,763 lines

  1. 1
  2. ; LORES.ASM     3/12/84
  3. ; INTERFACE ROUTINES TO USE 160X100 MODE OF COLOR GRAPHICS
  4. TITLE   LORES 160X100 GRAPHICS PRIMITIVES.
  5.         PAGE    62,100
  6.  
  7.         PUBLIC  LORES
  8.  
  9. ;       PUBLIC  FIRST_INIT,CLS,PLOTDOT,GETDOT
  10. ;       PUBLIC  DRAWLINE,BOX,CIRCLE
  11. ;       PUBLIC  RANDOM,RANDOMIZE
  12. ;       PUBLIC  LETTER,LOPRINT,SLOWLETTER
  13. ;       PUBLIC  SIN,COS,LOPAINT
  14.  
  15. ;
  16. ;       GENERAL FORM OF ALL ROUTINES FROM BASIC:
  17. ;
  18. ;       CALL LORES%(ROUTINE%,PARMS%(0))
  19. ;
  20. ;       WHERE ROUTINE% IS WHAT IS TO BE DONE,
  21. ;         AND PARMS%(0) IS AN INTEGER ARRAY OF 6 ELEMENTS WITH SPECS FOR ACTION.
  22. ;
  23. ;       UNLESS THE ROUTINE RETURNS A VALUE, ALL ELEMENTS OF PARMS%(X)
  24. ;         ARE RETURNED UNCHANGED.
  25. ;
  26.  
  27. TRUE    EQU     -1
  28. FALSE   EQU     0
  29.  
  30. COMPILER        EQU     FALSE   ; SET TO TRUE FOR COMPILER .OBJ FILE
  31.  
  32. REGISTER        EQU     3D4H
  33. CRT             EQU     3D5H
  34. MODE            EQU     3D8H
  35. COLORPORT       EQU     3D9H
  36. STATUS          EQU     3DAH
  37.  
  38. ROM_TABLE_ADDRESS       EQU     0FA6EH  ; CHARACTER PATTERNS IN ROM
  39. COLOR_CARD_SEGMENT      EQU     0B800H  ; WHERE THE ACTION IS
  40.  
  41. MULT            EQU     261     ; FOR RANDOM NUMBER GENERATOR
  42. MODULUS         EQU     32749
  43.  
  44. ABS0    SEGMENT AT 0
  45.         ORG     1DH*4
  46. PARM_PTR        LABEL   DWORD   ; FOR VIDEO HORIZONTAL SYNC.
  47.                                 ; LORES RESPECTS DOS MODE CO80,R
  48. ABS0    ENDS
  49.  
  50.  
  51. ; EQUATES FOR DRAWLINE
  52. ;
  53. ;  STACK HAS ADDRESS OF START OF PARMS.
  54. ;       V(0)    = X1    = START COL. (0-159)
  55. ;       V(1)    = Y1    = START ROW  (0-99)
  56. ;       V(2)    = X2    = END COLUMN
  57. ;       V(3)    = Y2    = END ROW
  58. ;       V(4)    = COLOR = ( 0-15 )
  59. ;       V(5)    = LENGTH= 0 FOR DRAW WHOLE LINE, ELSE SUB-SET
  60. ;
  61.  
  62. ARG1    EQU     WORD PTR [BP+4]         ; 4 FOR NEAR CALL, 6 FOR FAR
  63.  
  64. X1      EQU     WORD PTR [SI]
  65. Y1      EQU     WORD PTR [SI+2]
  66. X2      EQU     WORD PTR [SI+4]
  67. Y2      EQU     WORD PTR [SI+6]
  68. COLOR   EQU     BYTE PTR [SI+8]
  69. LEN     EQU     WORD PTR [SI+10]
  70.  
  71. ; THESE ARE VALUES THAT WILL BE INSERTED IN THE CODE FOR DRAWLINE
  72.         INC_X   EQU     41H
  73.         DEC_X   EQU     49H
  74.         INC_Y   EQU     42H
  75.         DEC_Y   EQU     4AH
  76.  
  77. ; THESE ARE ADDRESSES WHERE NEW CODE IS OVERLAYED FOR LINE
  78. ADJ_LONG_AXIS   EQU     BYTE PTR CS:[DI]
  79. ADJ_MASTER      EQU     WORD PTR CS:[DI+3]
  80. TEST_MASTER     EQU     WORD PTR CS:[DI+7]
  81. ALT_ADJ_MASTER  EQU     WORD PTR CS:[DI+13]
  82. ADJ_SHRT_AXIS   EQU     BYTE PTR CS:[DI+15]
  83.  
  84.  
  85. ;CGROUP  GROUP   CSEG
  86. CSEG    SEGMENT PARA PUBLIC 'CODE'
  87.         ASSUME  CS:CSEG
  88.  
  89. LORES   PROC    FAR             ; ENTRY FOR ALL LOBIO ROUTINES
  90.         PUSH    BP
  91.         MOV     BP,SP
  92.         MOV     AX,COLOR_CARD_SEGMENT
  93.         MOV     ES,AX           ; ALL ROUTINES ASSUME ES: FOR VIDEO WORK
  94.         MOV     SI,[BP+8]       ; ROUTINE NUMBER
  95.         MOV     AX,[SI]
  96.         SUB     AH,AH
  97.         SHL     AX,1
  98.         MOV     SI,[BP+6]       ; ARRAY(0)
  99.         MOV     BX,AX
  100.         CMP     BX,OUT_OF_RANGE
  101.         JAE     LORET
  102.         JMP     WORD PTR CS:[BX+OFFSET JUMP_TABLE]
  103.  
  104. LORET:
  105.         PUSH    DS
  106.         POP     ES
  107.         POP     BP
  108.         RET     4
  109.  
  110. JUMP_TABLE      LABEL   WORD
  111.         DW      OFFSET FIRST    ; 0 - ARRAY VALUES UNUSED, DUMMY ADDRESS NEEDED
  112.         DW      OFFSET CLS      ; 1 - V(0) = COLOR TO CLEAR SCREEN
  113.         DW      OFFSET PLOT     ; 2 - X, Y, COLOR
  114.         DW      OFFSET GET      ; 3 - X, Y, COLOR RETURNED IN V(2)
  115.         DW      OFFSET LINE     ; 4 - X1,Y1,X2,Y2,COLOR,LENGTH(0 FOR WHOLE LINE)
  116.         DW      OFFSET BOX      ; 5 - X1,Y1,X2,Y2,COLOR,LENGTH(SET TO 0 BY LORES)
  117.         DW      OFFSET CIRCLE_SETUP ; 6 - X,Y,RADIUS,ASPECT NUM,ASPECT DEN,COLOR
  118.         DW      OFFSET LETTER1  ; 7 - X(0-11),Y(0-19),ASC(LETTER$),COLOR
  119.         DW      OFFSET LETTER2  ; 8 - X,Y,LETTER,FOREGROUND,BACKGROUND
  120.         DW      OFFSET PRINT    ; 9 - X,Y,VARPTR(MESSAGE$),COLOR
  121.         DW      OFFSET PRINT2   ; 10 - DOES NOTHING FOR NOW
  122.         DW      OFFSET SINE     ; 11 - X(IN DEGREES),V(1) RETURNS SIN*10000
  123.         DW      OFFSET COSINE   ; 12 - X(IN DEGREES),V(1) RETURNS COS*10000
  124.         DW      OFFSET RND      ; 13 - IF V(0)=0 RANDOMIZE ELSE V(1) RND 1 TO X
  125.         DW      OFFSET SWITCH   ; 14 - TURN OFF LORES, USE MODE AT TIME OF ENTRY
  126.         DW      OFFSET LOMODE   ; 15 - V(0)=IBM VIDEO MODE ELSE -1 FOR LORES.
  127.         DW      OFFSET LOPAINT  ; 16 - X,Y,FILL,BOUNDARY
  128.  
  129. OUT_OF_RANGE    EQU     $-JUMP_TABLE
  130.  
  131. ;                0   1   2   3   4   5   6   7   8   9  OUT 3D4H
  132. VIDEO   DB      71H,50H,5AH,0AH,7FH,06H,64H,70H,02H,01H ; OUT 3D5H
  133. ; THIS IS THE SETUP FOR LORES MODE TO THE 6845 VIDEO CONTROLLER.
  134.  
  135. SEED    DW      41      ; RANDOM NUMBER SEED
  136.  
  137. BOXED   DW      6 DUP (0)  ; STORAGE FOR BOX ROUTINE
  138.  
  139. VIDMODE DB      0       ; SAVE IBM VIDEO MODE ON INITIALIZATION
  140. LOSTAT  DB      0       ; IS LORES ACTIVE?
  141. LOCOLOR DB      0       ; INIT=0, CLS SETS TO VALUE-USED BY PRINT FOR SCROLL
  142.  
  143. FIRST:
  144.         CALL    FIRST_INIT
  145.         JMP     LORET
  146.  
  147. PLOT:
  148.         MOV     DX,Y1
  149.         MOV     CX,X1
  150.         MOV     AX,X2
  151.         SUB     AH,AH
  152.         CALL    PLOTDOT
  153.         JMP     LORET
  154.  
  155. GET:
  156.         MOV     DX,Y1
  157.         MOV     CX,X1
  158.         CALL    GETDOT
  159.         MOV     X2,AX
  160.         JMP     LORET
  161.  
  162. LINE:
  163.         PUSH    SI
  164.         CALL    DRAWLINE
  165.         JMP     LORET
  166.  
  167. CIRCLE_SETUP:
  168.         MOV     AX,X1      ; X
  169.         PUSH    AX
  170.         MOV     AX,Y1      ; Y
  171.         PUSH    AX
  172.         MOV     AX,X2      ; RADIUS
  173.         OR      AX,AX
  174.         JZ      CIR_ABORT1 ; ZERO FOR RADIUS LEADS TO DIVIDE BY ZERO ERROR
  175.         PUSH    AX
  176.         MOV     AX,Y2      ; ASPECT NUMERATOR
  177.         OR      AX,AX
  178.         JZ      CIR_ABORT2 ; ZERO IN ASPECT RATIO IS BOGUS TOO
  179.         PUSH    AX
  180.         MOV     AX,[SI+8]  ; ASPECT DENOMINATOR
  181.         OR      AX,AX
  182.         JZ      CIR_ABORT3 ; SO ABORT ROUTINE FOR SAFETY.
  183.         PUSH    AX
  184.         MOV     AX,LEN     ; COLOR
  185.         PUSH    AX
  186.  
  187.         CALL    CIRCLE
  188.         JMP     LORET
  189.  
  190. CIR_ABORT3:
  191.         POP     AX         ; SAFE CIRCLE EXIT FOR ERROR CONDITIONS.
  192. CIR_ABORT2:
  193.         POP     AX
  194. CIR_ABORT1:
  195.         POP     AX
  196.         POP     AX
  197.         JMP     LORET
  198.  
  199. LETTER1:
  200.         MOV     AX,Y2   ; COLOR
  201.         MOV     AH,AL
  202.         MOV     BX,X2   ; ASCII VALUE OF LETTER
  203.         MOV     AL,BL
  204.         MOV     DX,X1   ; ROW (0-11)
  205.         MOV     DH,DL
  206.         MOV     BX,Y1   ; COL (0-19)
  207.         MOV     DL,BL
  208.  
  209.         CALL    LETTER  ; PRINT LETTER AT POS. IGNOR BACKGROUND
  210.         JMP     LORET
  211.  
  212. LETTER2:
  213.         MOV     AX,Y2   ; COLOR
  214.         MOV     AH,AL
  215.         MOV     AL,COLOR
  216.         MOV     CL,4
  217.         SHL     AL,CL
  218.         OR      AH,AL   ; BACKGROUND
  219.         MOV     BX,X2   ; LETTER
  220.         MOV     AL,BL
  221.         MOV     DX,X1   ; ROW
  222.         MOV     DH,DL
  223.         MOV     BX,Y1   ; COL
  224.         MOV     DL,BL
  225.  
  226.         CALL    SLOWLETTER  ; PRINT LETTER IN COLOR,BACKGROUND - FILL ALL DOTS.
  227.         JMP     LORET
  228.  
  229. PRINT:
  230.         MOV     AX,Y2    ; COLOR. IF BIT 7 SET, PRINT AS XOR
  231.         MOV     AH,AL
  232.         MOV     DX,X1   ; ROW (0-11)
  233.         MOV     DH,DL
  234.         MOV     BX,Y1   ; COL (0-19)
  235.         MOV     DL,BL
  236.         MOV     BX,X2   ; VARPTR OF STRING
  237.         PUSH    SI
  238. IF COMPILER
  239.         MOV     CX,[BX] ; COMPILER USES TWO BYTES FOR STRING - MAX LEN=32767
  240.         INC     BX
  241.         INC     BX
  242.         MOV     SI,[BX]
  243.  
  244. ELSE
  245.         MOV     CL,[BX] ; INTERPRETER USES ONE BYTE.
  246.         SUB     CH,CH
  247.         INC     BX
  248.         MOV     SI,[BX]
  249.  
  250. ENDIF
  251.         CALL    LOPRINT ; THIS WILL FIGURE OUT WHICH WAY TO PRINT.
  252.         POP     SI      ; GET BACK V(0)
  253.         SUB     AX,AX
  254.         MOV     AL,DH   ; X
  255.         MOV     X1,AX
  256.         MOV     AL,DL   ; Y
  257.         MOV     Y1,AX
  258.         JMP     LORET
  259.  
  260. PRINT2:
  261.         JMP     LORET
  262.  
  263. LOPAINT:
  264.         MOV     CX,X1   ; COL
  265.         MOV     DX,Y1   ; ROW
  266.         MOV     BX,X2   ; FILL COLOR
  267.         AND     BL,7FH  ; XOR IN PAINT LEADS TO PROBLEMS
  268.         MOV     AX,Y2   ; BOUNDARY COLOR
  269.         MOV     BH,AL   ; BH=BOUND,BL=FILL
  270.         MOV     AL,CL   ; MAKE ONE WORD SINCE
  271.         MOV     AH,DL   ; ROW=0-99,COL=0-159. SAVE STACK SPACE.
  272.         PUSH    AX      ; SAVE ON STACK FOR FIRST.
  273.  
  274.         CALL    LOPAINTR ; SOLVE RECURSIVELY
  275.         JMP     LORET   ; BACK I HOPE.
  276.  
  277. SINE:
  278.         MOV     AX,X1   ; SIN/COS USE DEGREES, NOT RADIANS
  279.                         ; RETURN RESULT IN V(1) AS VALUE*10000
  280. SINE1:
  281.         CMP     AX,360  ; SCALE TO 0-319 RANGE.
  282.         JB      SINE2
  283.         SUB     AX,360
  284.         JMP     SINE1
  285.  
  286. SINE2:
  287.         CALL    SIN
  288.         MOV     Y1,AX   ; RETURN IN V(1)
  289.         JMP     LORET
  290.  
  291. COSINE:
  292.         MOV     AX,X1
  293.  
  294. COSINE1:
  295.         CMP     AX,360
  296.         JB      COSINE2
  297.         SUB     AX,360
  298.         JMP     COSINE1
  299.  
  300. COSINE2:
  301.         CALL    COS
  302.         MOV     Y1,AX
  303.         JMP     LORET
  304.  
  305. RND:
  306.         MOV     AX,X1   ; GET NUMBER
  307.         OR      AX,AX
  308.         JZ      RND1    ; IF ITS 0 THEN RESEED GENERATOR
  309.         CALL    RANDOM
  310.         MOV     Y1,AX   ; ELSE RETURN RND FROM 1 TO X IN ARRAY(1)
  311.         JMP     LORET
  312.  
  313. RND1:
  314.         CALL    RANDOMIZE
  315.         MOV     AX,0FFFFH  ; PUT -1 IN ARRAY(0) TO INDICATE DONE
  316.         MOV     X1,AX
  317.         JMP     LORET
  318.  
  319. LOMODE:
  320.         CALL    LOMO            ; CHECK FOR LORES ACTIVE,
  321.         JMP     LORET           ; ELSE RETURN IBM VIDEO MODE.
  322.  
  323. LORES   ENDP
  324.  
  325. LOMO    PROC    NEAR
  326.         MOV     AL,CS:LOSTAT    ; LOSTAT SET TO -1 IF LORES ACTIVE
  327.         OR      AL,AL
  328.         JZ      LOMO1
  329.         MOV     AX,-1
  330.         MOV     X1,AX
  331.         RET
  332.  
  333. LOMO1:
  334.         MOV     AH,15           ; IF NOT ACTIVE, RETURN ACTUAL VIDEO STATE
  335.         INT     10H
  336.         MOV     CS:VIDMODE,AL
  337.         SUB     AH,AH
  338.         MOV     X1,AX
  339.         RET
  340. LOMO    ENDP
  341.  
  342. SWITCH  PROC    NEAR
  343. ; TURN OFF LORES MODE, RESTORING ORIGINAL SCREEN MODE. IF ON MONO, DO NOTHING.
  344.  
  345.         SUB     AL,AL
  346.         MOV     CS:LOSTAT,AL    ; INDICATE OFF
  347.         MOV     AL,CS:VIDMODE
  348.         CMP     AL,7            ; MONO SCREEN?
  349.         JZ      SWIT1           ; DON'T DO ANYTHING,
  350.         SUB     AH,AH           ; ELSE RESTORE MODE ON INIT.
  351.         PUSH    BP
  352.         PUSH    SI
  353.         INT     10H
  354.         POP     SI
  355.         POP     BP
  356. SWIT1:
  357.         JMP     LORET
  358.  
  359. SWITCH  ENDP
  360.  
  361. FIRST_INIT    PROC    NEAR
  362. ; SET UP SCREEN
  363. ; NO REGS CHANGED
  364.         PUSH    SI
  365.         PUSH    DX
  366.         PUSH    CX
  367.         PUSH    BX
  368.         PUSH    AX
  369.         MOV     AH,15           ; STORE CURRENT MODE FOR LATER
  370.         INT     10H
  371.         MOV     CS:VIDMODE,AL
  372.         MOV     DX,MODE
  373.         MOV     AL,1            ; TURN OFF VIDEO FOR SETUP
  374.         OUT     DX,AL
  375.  
  376.         PUSH    DS              ; SAVE TO GET HORIZ. SYNC FROM TABLE
  377.         MOV     AX,ABS0
  378.         MOV     DS,AX           ; PARM_PTR AT 0:74H
  379.  
  380.         ASSUME  DS:ABS0
  381.         LDS     BX,PARM_PTR
  382.         ADD     BX,12H          ; POINTS TO 80X25 SYNCH
  383.         MOV     AL,[BX]         ; GET VALUE
  384.         POP     DS              ; BACK TO START VALUE.
  385.         ASSUME  DS:NOTHING
  386.  
  387.         MOV     SI,OFFSET CS:VIDEO
  388.         MOV     CS:[SI+2],AL    ; STORE IN OUR TABLE
  389.  
  390.         MOV     DX,REGISTER     ; 6845 OUT 3D4 THEN OUT 3D5
  391.         MOV     CX,10           ; SET TEN REGS
  392.  
  393. FINIT_LOOP:
  394.         MOV     AL,10
  395.         SUB     AL,CL
  396.         OUT     DX,AL
  397.         INC     DX
  398.         MOV     AL,CS:[SI]
  399.         OUT     DX,AL
  400.         INC     SI
  401.         DEC     DX
  402.  
  403.         LOOP    FINIT_LOOP
  404.  
  405.  
  406.         MOV     CX,1FFFH
  407.         MOV     DI,0
  408.         MOV     AX,00DEH        ; SET TO BLACK
  409.         CLD
  410.         REP     STOSW
  411.  
  412.         MOV     DX,MODE
  413.         MOV     AL,9
  414.         OUT     DX,AL           ; RE-ENABLE VIDEO, DISABLE BLINK
  415.  
  416.         MOV     AL,0FFH
  417.         MOV     CS:LOSTAT,AL    ; INDICATE ON
  418.         SUB     AL,AL
  419.         MOV     CS:LOCOLOR,AL   ; COLOR 0 (BLACK)
  420.  
  421.         POP     AX
  422.         POP     BX
  423.         POP     CX
  424.         POP     DX
  425.         POP     SI              ; RESTORE-RETURN
  426.         RET
  427.  
  428. FIRST_INIT    ENDP
  429.  
  430. CLS     PROC    NEAR
  431. ; CLS TO COLOR IN AL
  432. ; AX CHANGED, OTHERS PRESERVED
  433.  
  434.         MOV     AX,[SI]         ; COLOR
  435.         MOV     CS:LOCOLOR,AL   ; STORE FOR LATER
  436.         AND     CS:LOCOLOR,7FH  ; STRIP OFF XOR BIT
  437.         PUSH    DI
  438.         PUSH    DX
  439.         PUSH    CX              ; SAVE REGS
  440.  
  441.         TEST    AL,80H          ; WANT AN XOR?
  442.         JZ      CLS10
  443.         CALL    CLS_XOR
  444.         JMP     CLS20
  445.  
  446. CLS10:
  447.         PUSH    AX              ; SAVE COLOR
  448.         MOV     DX,MODE
  449.         MOV     AL,1            ; TURN OFF VIDEO FOR SETUP
  450.         OUT     DX,AL
  451.  
  452.         MOV     CX,1FFFH
  453.         MOV     DI,0
  454.         POP     AX              ; GET COLOR SPEC
  455.         AND     AL,0FH          ; ONLY 0-15
  456.         MOV     AH,AL           ; COPY
  457.         SHL     AL,1            ; MOV LO 4 BITS TO HIGH
  458.         SHL     AL,1
  459.         SHL     AL,1
  460.         SHL     AL,1
  461.         OR      AH,AL           ; SAME COLOR TO EACH DOT
  462.  
  463.         MOV     AL,0DEH        ; CHARACTER FOR SETUP
  464.         CLD
  465.         REP     STOSW
  466.  
  467.         MOV     DX,MODE
  468.         MOV     AL,9
  469.         OUT     DX,AL           ; RE-ENABLE VIDEO, DISABLE BLINK
  470.  
  471. CLS20:
  472.         POP     CX              ; RESTORE REGS
  473.         POP     DX
  474.         POP     DI
  475.         JMP     LORET           ; BACK TO CALLER
  476.  
  477. CLS_XOR:
  478.         PUSH    DS
  479.         PUSH    ES
  480.         POP     DS              ; USE DS TO AVOID SEG OVERRIDE.
  481.         PUSH    BX
  482.         AND     AL,0FH          ; ONLY 0-15
  483.         MOV     DI,1            ; FIRST ATTRIBUTE POS.
  484.         MOV     BL,AL           ; COPY COLOR TO BL
  485.         MOV     CL,4
  486.         SHL     BL,CL           ; SHIFT LO4 BITS TO HI
  487.         OR      BL,AL           ; GET BACK ORIG. BL MAKES TWO DOTS.
  488.         MOV     CX,8000         ; ATTRIBUTES
  489.         MOV     DX,STATUS
  490.  
  491. CLXR10:
  492.         IN      AL,DX           ; WAIT FOR HORIZ. RETRACE
  493.         TEST    AL,1            ; FOR ACTION
  494.         JNZ     CLXR10
  495.         CLI
  496.  
  497. CLXR20:
  498.         IN      AL,DX
  499.         TEST    AL,1
  500.         JZ      CLXR20
  501.                                 ; XOR TO MEMORY TAKES TOO LONG FOR
  502.         MOV     AH,[DI]         ; HORIZ. RETRACE WINDOW.
  503.         STI                     ; INTERRUPTS OK.
  504.         XOR     AH,BL
  505. CLXR30:
  506.         IN      AL,DX           ; WAIT FOR HORIZ. RETRACE
  507.         TEST    AL,1            ; FOR ACTION
  508.         JNZ     CLXR30
  509.         CLI
  510.  
  511. CLXR40:                         ; THIS TAKES LONGER, BUT MAKES NO SNOW
  512.         IN      AL,DX
  513.         TEST    AL,1
  514.         JZ      CLXR40
  515.  
  516.         MOV     [DI],AH         ; BACK TO SCREEN
  517.         STI
  518.         INC     DI              ; GET TO NEXT
  519.         INC     DI
  520.         LOOP    CLXR10          ; DO TILL DONE.
  521.  
  522.         POP     BX              ; KEEP IT NEAT
  523.         POP     DS
  524.         RET                     ; BACK TO CALLER
  525.  
  526. CLS     ENDP
  527.  
  528. PLOTDOT PROC    NEAR
  529. ; SET A DOT TO COLOR
  530. ;    DX = ROW   ( 0-99 )
  531. ;    CX = COL   ( 0-159 )
  532. ;    AL = COLOR
  533. ; ASSUMES ES POINTS TO VIDEO MEMORY
  534. ; ALL REGS PRESERVED.
  535. ; PLOTDOT MIMICS INT 10H WRITE DOT, INCLUDING XOR DOT
  536.         PUSH    DX
  537.         PUSH    SI              ; SAVE REGS
  538.         PUSH    CX
  539.         PUSH    BX
  540.         PUSH    AX
  541.         CMP     DX,99           ; DON'T DO FOR OUT OF RANGE
  542.         JA      PDBRIDGE        ; NO JUMP TAKES LESS TIME
  543.         CMP     CX,159
  544.         JA      PDBRIDGE
  545.         PUSH    AX              ; SAVE COLOR
  546.         MOV     AX,DX           ; COPY ROW TO AX
  547.         SHL     AX,1            ; *2   ROW*160=
  548.         SHL     AX,1            ; *4   ROW*128
  549.         SHL     AX,1            ; *8
  550.         SHL     AX,1            ; *16
  551.         SHL     AX,1            ; *32
  552.         SHL     AX,1            ; *64
  553.         SHL     AX,1            ; *128
  554.         SHL     DX,1            ; *2   + ROW*32
  555.         SHL     DX,1            ; *4
  556.         SHL     DX,1            ; *8   IN 27 CLOCKS
  557.         SHL     DX,1            ; *16  INSTEAD OF ~80
  558.         SHL     DX,1            ; *32
  559.         ADD     AX,DX           ; ROW*128 + ROW*32
  560.         MOV     SI,AX           ; MOVE TO SI
  561.         ADD     SI,CX           ; + COL
  562.         OR      SI,1            ; ADJUST FOR ATTRIBUTE
  563.         POP     BX              ; GET BACK COLOR
  564.  
  565.         MOV     DX,STATUS
  566.  
  567. PDW1:
  568.         IN      AL,DX
  569.         TEST    AL,1
  570.         JNZ     PDW1            ; WAIT FOR HORIZ. RETRACE
  571.         CLI                     ; NO MORE INTERRUPTS
  572.  
  573. PDW2:
  574.         IN      AL,DX           ; GET STATUS
  575.         TEST    AL,1            ; IS IT HIGH
  576.         JZ      PDW2            ; WAIT TILL IT IS
  577.  
  578.         MOV     BH,ES:[SI]      ; GET CURRENT BYTE
  579.         STI                     ; INTERRUPTS OK
  580.         TEST    CX,1            ; CHECK ODD/EVEN
  581.         JZ      PD1
  582.         TEST    BL,80H          ; CHECK FOR XOR
  583.         JZ      PDW2A           ; NO, JUMP
  584.         MOV     CH,BH           ; SAVE ORIG
  585.         XOR     BH,BL           ; XOR BOTH
  586.         AND     BH,0FH          ; MASK OUT OTHER DOT
  587.         AND     CH,0F0H         ; MASK OUR DOT
  588.         OR      BH,CH           ; COMBINE
  589.         JMP     SHORT PDW3      ; ONWARD
  590.  
  591. PDBRIDGE:
  592.         JMP     PDRET           ; HOP SKIP AND A JUMP
  593. PDW2A:
  594.         AND     BH,0F0H         ; ITS ODD - SET FOREGROUND
  595.         AND     BL,0FH          ; FILTER BOGUS COLOR
  596.         OR      BH,BL           ; COMBINE
  597.  
  598. PDW3:
  599.         IN      AL,DX           ; WAIT FOR HORIZ. RETRACE
  600.         TEST    AL,1
  601.         JNZ     PDW3
  602.         CLI
  603.  
  604. PDW4:
  605.         IN      AL,DX
  606.         TEST    AL,1
  607.         JZ      PDW4
  608.  
  609.         MOV     ES:[SI],BH      ; BACK TO SCREEN
  610.         STI
  611.         JMP     SHORT PDRET
  612.  
  613. PD1:
  614.         TEST    BL,80H          ; CHECK FOR XOR
  615.         JZ      PD1A            ; NO-GO ON
  616.         SHL     BL,1            ; SHIFT TO BACKGROUND
  617.         SHL     BL,1
  618.         SHL     BL,1
  619.         SHL     BL,1
  620.  
  621.         MOV     CH,BH           ; SAVE ORIG
  622.         XOR     BH,BL           ; XOR BOTH
  623.         AND     BH,0F0H         ; MASK OUT OTHER DOT
  624.         AND     CH,0FH          ; MASK OUR DOT
  625.         OR      BH,CH           ; COMBINE
  626.         JMP     SHORT PDW5      ; ONWARD
  627.  
  628. PD1A:
  629.         AND     BH,0FH          ; SAVE FOREGROUND
  630.         SHL     BL,1            ; SHIFT TO BACKGROUND
  631.         SHL     BL,1
  632.         SHL     BL,1
  633.         SHL     BL,1
  634.         OR      BH,BL           ; COMBINE
  635.  
  636. PDW5:
  637.         IN      AL,DX           ; WAIT RETRACE TO STORE ON SCREEN
  638.         TEST    AL,1
  639.         JNZ     PDW5
  640.         CLI
  641.  
  642. PDW6:
  643.         IN      AL,DX
  644.         TEST    AL,1
  645.         JZ      PDW6
  646.         MOV     ES:[SI],BH
  647.         STI
  648.  
  649. PDRET:
  650.         POP     AX
  651.         POP     BX
  652.         POP     CX
  653.         POP     SI
  654.         POP     DX
  655.         RET                     ; BACK TO CALLER
  656.  
  657. PLOTDOT ENDP
  658.  
  659. GETDOT  PROC    NEAR
  660. ; GET A DOT, RETURN COLOR
  661. ;    DX = ROW   ( 0-99 )
  662. ;    CX = COL   ( 0-159 )
  663. ;    RETURNS AX = COLOR, OR -1 IF REQUEST OUT OF RANGE
  664. ; ASSUMES ES POINTS TO VIDEO MEMORY
  665.         PUSH    DX
  666.         PUSH    SI              ; SAVE REGS
  667.         PUSH    CX
  668.         PUSH    BX
  669.         CMP     DX,99           ; DON'T DO FOR OUT OF RANGE
  670.         JA      GDRET_BAD
  671.         CMP     CX,159
  672.         JA      GDRET_BAD
  673.         MOV     AX,DX
  674.         MOV     BL,160
  675.         MUL     BL              ; 160 * ROW
  676.         MOV     SI,AX
  677.         ADD     SI,CX           ; + COL
  678.         OR      SI,1            ; ADJUST FOR ATTRIBUTE
  679.  
  680.         MOV     DX,STATUS
  681.  
  682. GDW1:
  683.         IN      AL,DX
  684.         TEST    AL,1
  685.         JNZ     GDW1            ; WAIT FOR HORIZ. RETRACE
  686.         CLI                     ; NO MORE INTERRUPTS
  687.  
  688. GDW2:
  689.         IN      AL,DX           ; GET STATUS
  690.         TEST    AL,1            ; IS IT HIGH
  691.         JZ      GDW2            ; WAIT TILL IT IS
  692.  
  693.         MOV     AL,ES:[SI]      ; GET CURRENT BYTE
  694.         STI                     ; INTERRUPTS OK
  695.  
  696.         TEST    CL,1            ; ODD?
  697.         JZ      GD1
  698.         AND     AL,0FH          ; FILTER OTHER DOT
  699.         SUB     AH,AH
  700.         JMP     SHORT GDRET     ;BACK
  701.  
  702. GD1:
  703.         MOV     CL,4
  704.         SHR     AL,CL           ; HI DOT TO LOW
  705.         SUB     AH,AH
  706.         JMP     SHORT GDRET
  707.  
  708. GDRET_BAD:
  709.         MOV     AX,0FFFFH       ; -1 = OUT OF RANGE
  710.  
  711. GDRET:
  712.         POP     BX
  713.         POP     CX
  714.         POP     SI
  715.         POP     DX
  716.         RET
  717.  
  718.  
  719. GETDOT  ENDP
  720.  
  721.  
  722. ;       DRAWLINE.ASM  - - AS A NEAR CALL
  723. ;       FROM DR. DOBBS -- JUNE 1983, P.75
  724. ;       USES FAST-LINE DRAWING TECHNIQUE FROM BYTE, AUG. 81
  725. ;
  726. ;       ARGS IN ARRAY PARMS
  727. ;       X1      Y1      X2      Y2      COLOR   LEN
  728. ;       PUSH PARMS OFFSET ON STACK, DISCARDED ON RETURN
  729. ;       I.E. PUSH ADDRESS_OF_FIRST_ARRAY_ELEMENT
  730. ;       DON'T EXPECT IT TO BE THERE ON RETURN
  731. ;       SEGMENTS, BP PRESERVED, OTHERS CHANGED.
  732.  
  733. DRAWLINE PROC   NEAR
  734.         PUSH    BP
  735.         MOV     BP,SP
  736.         MOV     SI,ARG1   ; I.E. V%(0)
  737.         MOV     BL,INC_X
  738.         MOV     AX,X2
  739.         SUB     AX,X1
  740.         JGE     DL1
  741.         MOV     BL,DEC_X
  742.         NEG     AX
  743. DL1:
  744.         MOV     CX,AX
  745.         MOV     BH,INC_Y
  746.         MOV     AX,Y2
  747.         SUB     AX,Y1
  748.         JGE     DL2
  749.         MOV     BH,DEC_Y
  750.         NEG     AX
  751. DL2:
  752.         MOV     DX,AX
  753.         MOV     DI,OFFSET CS:MODIFY_BASE
  754.         CMP     DX,CX
  755.         JGE     DL3
  756.         XCHG    CX,DX
  757.         XCHG    BL,BH
  758. DL3:
  759.         MOV     ADJ_LONG_AXIS,BH
  760.         MOV     ADJ_MASTER,CX
  761.         SHR     CX,1
  762.         MOV     TEST_MASTER,CX
  763.         MOV     ALT_ADJ_MASTER,DX
  764.         MOV     ADJ_SHRT_AXIS,BL
  765.         MOV     DI,DX
  766.         CMP     LEN,0
  767.         JLE     DL4
  768.         MOV     DI,LEN
  769. DL4:
  770.         MOV     CX,X1
  771.         MOV     DX,Y1
  772.         MOV     AL,COLOR
  773.         SUB     BX,BX
  774. DL5:
  775.         CALL    PLOTDOT
  776.  
  777. MODIFY_BASE     LABEL   BYTE
  778.  
  779.         INC     CX
  780.         ADD     BX,1111H
  781.         CMP     BX,1111H
  782.         JLE     DL6
  783.         SUB     BX,1111H
  784.         INC     DX
  785. DL6:
  786.         DEC     DI
  787.         JGE     DL5
  788.  
  789.         POP     BP
  790.         RET     2
  791. DRAWLINE ENDP
  792.  
  793. BOX     PROC    NEAR
  794. ; PARMS SET UP IN BOXED
  795. ; SEGMENTS, BP PRESERVED, OTHERS CHANGED
  796.  
  797.         MOV     DI,OFFSET BOXED
  798.         PUSH    DI
  799.         PUSH    SI              ; SAVE FOR US
  800.         PUSH    ES
  801.         PUSH    CS
  802.         POP     ES
  803.         MOV     CX,12           ; GET ARGS TO TEMP AREA
  804.         CLD
  805.         REP     MOVSB
  806.         POP     ES
  807.         POP     SI
  808.         POP     DI
  809.         MOV     AX,CS:BOXED     ; BX1
  810.         MOV     X1,AX
  811.         MOV     AX,CS:BOXED+2   ; BY1
  812.         MOV     Y1,AX
  813.         MOV     Y2,AX           ; Y2=Y1
  814.         MOV     AX,CS:BOXED+4   ; BX2
  815.         MOV     X2,AX
  816.         SUB     AX,AX
  817.         MOV     LEN,AX          ; LENGTH = WHOLE
  818.  
  819.         PUSH    SI
  820.         PUSH    SI              ; STORE FOR DRAWLINE
  821.         CALL    DRAWLINE
  822.  
  823.         POP     SI
  824.         PUSH    SI
  825.         MOV     AX,CS:BOXED+4   ; BX2
  826.         MOV     X1,AX
  827.         MOV     AX,CS:BOXED+6   ; BY2
  828.         MOV     Y2,AX           ; Y2 (Y1 OK FROM LAST)
  829.  
  830.         PUSH    SI
  831.         CALL    DRAWLINE
  832.  
  833.         POP     SI
  834.         PUSH    SI
  835.         MOV     AX,CS:BOXED+6   ; BY2
  836.         MOV     Y1,AX           ; Y1
  837.         MOV     AX,CS:BOXED     ; BX1
  838.         MOV     X2,AX           ; X2
  839.  
  840.         PUSH    SI
  841.         CALL    DRAWLINE
  842.  
  843.         POP     SI
  844.         PUSH    SI
  845.  
  846.         MOV     AX,CS:BOXED     ; BX1
  847.         MOV     X1,AX           ; X1
  848.         MOV     AX,CS:BOXED+2   ; BY1
  849.         MOV     Y2,AX           ; Y2
  850.  
  851.         PUSH    SI
  852.         CALL    DRAWLINE
  853.  
  854.         POP     DI
  855.  
  856.         MOV     SI,OFFSET BOXED
  857.         PUSH    CS
  858.         PUSH    DS
  859.         POP     ES
  860.         POP     DS
  861.  
  862.         MOV     CX,12           ; PUT ARGS BACK IN ARRAY
  863.         CLD
  864.         REP     MOVSB
  865.  
  866.         MOV     AX,ES
  867.         MOV     DS,AX
  868.  
  869.         JMP     LORET
  870.  
  871. BOX     ENDP
  872.  
  873. ;-----------------------------------
  874. ; PROCEDURE
  875. ; CIRCLE(X,Y,RADIUS,NUMBER,DENOM,COLOR:INTEGER)
  876. ;
  877. ; DAN LEE  JULY 1, 1982
  878. ; SOURCEWARE
  879. ;
  880. ; DRAWS A CIRCLE AT CENTER (X,Y) WITH ASPECT
  881. ; RATIO NUMER/DENOM; RADIUS IN COLUMN UNITS
  882. ;
  883. ; ASSUMES ENTRY VIA INTER-SEGMENT CALL,
  884. ;       MODIFIED HERE AS INTRA-SEGMENT
  885. ; FRAME:        VALUE X         : BP+16
  886. ;               VALUE Y         : BP+14
  887. ;               VALUE RADIUS    : BP+12
  888. ;               VALUE NUMER     : BP+10
  889. ;               VALUE DENOM     : BP+8
  890. ;               VALUE COLOR     : BP+6
  891. ; SEGMENTS, BP PRESERVED, OTHERS CHANGED
  892. ;--------------------------------------
  893.  
  894. CIRCLE  PROC    NEAR
  895.         PUSH    BP
  896.         PUSH    BP              ; AS SUBSTITUTE FOR NEAR
  897.         MOV     BP,SP
  898.         MOV     AX,[BP+10]
  899.         MOV     BX,1024
  900.         IMUL    BX
  901.         MOV     CX,[BP+8]
  902.         IDIV    CX
  903.         PUSH    AX
  904.         XCHG    AX,CX
  905.         MOV     CX,[BP+10]
  906.         IMUL    BX
  907.         IDIV    CX
  908.         MOV     [BP+8],AX
  909.         POP     AX
  910.         MOV     [BP+10],AX
  911.  
  912. ; START BY INCREMENTING Y BY ONE UNIT AND
  913. ; DECREMENTING X BY TAN UNITS*INV ASPECT
  914. ; START AT (RADIUS,Y) AND PLOT TO 45 DEGREES
  915.  
  916.         MOV     AX,[BP+12]
  917.         MOV     BX,1024
  918.         IMUL    BX
  919.         SUB     DI,DI
  920.  
  921. CR5:
  922.         PUSH    AX
  923.         PUSH    DX
  924.         SUB     BX,BX
  925.         ADD     AX,512
  926.         ADC     DX,BX
  927.         MOV     BX,1024
  928.         IDIV    BX
  929.         MOV     BX,AX
  930.         ADD     AX,[BP+16]
  931.         MOV     DX,[BP+14]
  932.         SUB     DX,DI
  933.         MOV     CX,AX
  934.         MOV     AL,[BP+6]
  935.         MOV     AH,12
  936.         CALL    PLOTDOT
  937.         SUB     CX,BX
  938.         SUB     CX,BX
  939.         CALL    PLOTDOT
  940.         ADD     DX,DI
  941.         ADD     DX,DI
  942.         CALL    PLOTDOT
  943.         ADD     CX,BX
  944.         ADD     CX,BX
  945.         CALL    PLOTDOT
  946.  
  947. ; CX NOW AT ORIGINAL POINT
  948.  
  949.         XCHG    CX,BX
  950.         INC     DI
  951.         MOV     AX,DI
  952.         MOV     BX,[BP+8]
  953.         IMUL    BX
  954.         IDIV    CX
  955.         SUB     DX,DX
  956.         MOV     SI,AX
  957.         IDIV    BX
  958.         CMP     AX,1
  959.         POP     DX
  960.         POP     AX
  961.         JAE     CR7
  962.         NEG     SI
  963.         MOV     BX,-1
  964.         ADD     AX,SI
  965.         ADC     DX,BX
  966.         JMP     SHORT CR5
  967.  
  968. ; PLOT 45 TO 90 DEGREES
  969. ; NOW DECREASE X BY ONE UNIT AND
  970. ; INCREASE Y BY COT UNITS*ASPECT RATIO
  971.  
  972. CR7:
  973.         MOV     AX,DI
  974.         MOV     BX,1024
  975.         IMUL    BX
  976.         MOV     DI,CX
  977.         DEC     DI
  978.  
  979. CR8:
  980.         PUSH    AX
  981.         PUSH    DX
  982.         SUB     BX,BX
  983.         ADD     AX,512
  984.         ADC     DX,BX
  985.         MOV     BX,1024
  986.         IDIV    BX
  987.         MOV     BX,AX
  988.         ADD     AX,[BP+14]
  989.         MOV     CX,[BP+16]
  990.         ADD     CX,DI
  991.         MOV     DX,AX
  992.         MOV     AL,[BP+6]
  993.         MOV     AH,12
  994.         CALL    PLOTDOT
  995.  
  996.         SUB     CX,DI
  997.         SUB     CX,DI
  998.         CALL    PLOTDOT
  999.         SUB     DX,BX
  1000.         SUB     DX,BX
  1001.         CALL    PLOTDOT
  1002.         ADD     CX,DI
  1003.         ADD     CX,DI
  1004.         CALL    PLOTDOT
  1005.         SUB     DX,[BP+14]
  1006.         NEG     DX
  1007.         XCHG    CX,DX
  1008.         OR      DI,DI
  1009.         JS      CR11
  1010.         DEC     DI
  1011.         MOV     AX,DI
  1012.         MOV     BX,[BP+10]
  1013.         IMUL    BX
  1014.         IDIV    CX
  1015.         MOV     SI,AX
  1016.  
  1017.         POP     DX
  1018.         POP     AX
  1019.         SUB     BX,BX
  1020.         OR      SI,SI
  1021.         JNS     CR10
  1022.         MOV     BX,-1
  1023.  
  1024. CR10:
  1025.         ADD     AX,SI
  1026.         ADC     DX,BX
  1027.         JMP     SHORT CR8
  1028.  
  1029. ; EXIT
  1030.  
  1031. CR11:
  1032.         ADD     SP,4
  1033.         POP     BP
  1034.         POP     BP
  1035.         RET     12
  1036.  
  1037. CIRCLE  ENDP
  1038.  
  1039. LOPAINTR PROC    NEAR
  1040. ; USING BOUNDARY FILL RECURSIVE ALGORITHM
  1041. ; FROM FUNDAMENTALS OF INTERACTIVE COMPUTER GRAPHICS
  1042. ; BY J.D. FOLEY AND A. VAN DAM
  1043. ; ADDISON-WESLEY 1982, P. 450
  1044. ; HAS ONE STACK DATA AS HI=ROW,LO=COL
  1045. ; BX HAS BEEN SET WITH COLOR AS BH=BOUNDARY,BL=FILL COLOR
  1046.  
  1047.         PUSH    BP
  1048.         MOV     BP,SP
  1049.         MOV     CL,[BP+4]       ; LO BYTE=COL
  1050.         SUB     CH,CH           ; 0-159
  1051.         MOV     DL,[BP+5]       ; HI BYTE=ROW
  1052.         SUB     DH,DH
  1053.         MOV     SI,CX           ; SAVE FOR LEFT SCAN
  1054.  
  1055. SCAN_WRITE_RIGHT:
  1056.         MOV     AL,BL           ; FILL COLOR
  1057.         CALL    PLOTDOT
  1058.         INC     CX
  1059.         CALL    GETDOT
  1060.         CMP     AL,BL           ; IS IT FILL COLOR?
  1061.         JZ      LPR10
  1062.         CMP     AL,BH           ; IS IT BOUNDARY COLOR?
  1063.         JZ      LPR10
  1064.         CMP     AL,0FFH         ; IS IT OUT OF RANGE?
  1065.         JZ      LPR10
  1066.         JMP     SCAN_WRITE_RIGHT ; NO, KEEP GOING
  1067.  
  1068. LPR10:
  1069.         DEC     CX
  1070.         XCHG    SI,CX           ; SAVE RIGHTMOST FOR LATER
  1071.  
  1072. SCAN_WRITE_LEFT:
  1073.         MOV     AL,BL
  1074.         CALL    PLOTDOT
  1075.         DEC     CX
  1076.         CALL    GETDOT
  1077.         CMP     AL,BL           ; IS IT FILL COLOR?
  1078.         JZ      LPR20
  1079.         CMP     AL,BH           ; IS IT BOUNDARY COLOR?
  1080.         JZ      LPR20
  1081.         CMP     AL,0FFH         ; IS IT OUT OF RANGE?
  1082.         JZ      LPR20
  1083.         JMP     SCAN_WRITE_LEFT ; NO, KEEP GOING
  1084.  
  1085. LPR20:
  1086.         INC     CX
  1087.         MOV     DI,CX           ; SAVE LEFTMOST
  1088.  
  1089.         DEC     DX              ; UP ONE LINE
  1090.         CMP     DX,0            ; IS LESS THAN 0?
  1091.         JL      FIND_DOWN_RIGHT
  1092.         MOV     CX,SI           ; RECOVER RIGHT
  1093.  
  1094. FIND_UP_RIGHT:
  1095.         CMP     CX,DI           ; END OF SCAN?
  1096.         JL      FIND_DOWN_RIGHT
  1097.         CALL    GETDOT
  1098.         CMP     AL,BL           ; FILL COLOR?
  1099.         JZ      LPR40           ; SCAN FOR START
  1100.         CMP     AL,BH           ; BOUNDARY COLOR?
  1101.         JZ      LPR40
  1102. LPR25:                          ; IF NOT FILL/BOUND, STACK IT
  1103.         MOV     AH,DL           ; ROW TO HI
  1104.         MOV     AL,CL           ; COL TO LO
  1105.         PUSH    AX              ; ITS A START, SAVE ON STACK
  1106.  
  1107. LPR30:                          ; SCAN FOR BOUNDARY/FILL
  1108.         DEC     CX
  1109.         CMP     CX,DI           ; END OF SCAN?
  1110.         JL      FIND_DOWN_RIGHT
  1111.         CALL    GETDOT
  1112.         CMP     AL,BL           ; IS IT FILL?
  1113.         JZ      LPR40
  1114.         CMP     AL,BH           ; OR BOUNDARY?
  1115.         JZ      LPR40           ; IF SO, LOOK FOR START
  1116.         JMP     LPR30           ; ELSE CONTINUE
  1117.  
  1118. LPR40:
  1119.         DEC     CX
  1120.         CMP     CX,DI
  1121.         JL      FIND_DOWN_RIGHT
  1122.         CALL    GETDOT
  1123.         CMP     AL,BL           ; IS IT FILL?
  1124.         JZ      LPR40
  1125.         CMP     AL,BH           ; OR BOUNDARY?
  1126.         JZ      LPR40           ; IF SO CONTINUE SCAN
  1127.         JMP     LPR25           ; ITS A START
  1128.  
  1129. FIND_DOWN_RIGHT:
  1130.         MOV     CX,SI           ; RECOVER RIGHT
  1131.         INC     DX
  1132.         INC     DX              ; SCAN ROW BELOW
  1133.         CMP     DX,99
  1134.         JA      DO_WHILE
  1135.  
  1136.         CMP     CX,DI           ; END OF SCAN?
  1137.         JL      DO_WHILE
  1138.         CALL    GETDOT
  1139.         CMP     AL,BL           ; FILL COLOR?
  1140.         JZ      LPR60           ; SCAN FOR START
  1141.         CMP     AL,BH           ; BOUNDARY COLOR?
  1142.         JZ      LPR60
  1143. LPR45:
  1144.         MOV     AH,DL           ; ROW TO HI
  1145.         MOV     AL,CL           ; COL TO LO
  1146.         PUSH    AX              ; ITS A START, SAVE ON STACK
  1147.  
  1148. LPR50:                          ; SCAN FOR BOUNDARY/FILL
  1149.         DEC     CX
  1150.         CMP     CX,DI           ; END OF SCAN?
  1151.         JL      DO_WHILE
  1152.         CALL    GETDOT
  1153.         CMP     AL,BL           ; IS IT FILL?
  1154.         JZ      LPR60
  1155.         CMP     AL,BH           ; OR BOUNDARY?
  1156.         JZ      LPR60           ; IF SO, LOOK FOR START
  1157.         JMP     LPR50           ; ELSE CONTINUE
  1158.  
  1159. LPR60:
  1160.         DEC     CX
  1161.         CMP     CX,DI
  1162.         JL      DO_WHILE
  1163.         CALL    GETDOT
  1164.         CMP     AL,BL           ; IS IT FILL?
  1165.         JZ      LPR60
  1166.         CMP     AL,BH           ; OR BOUNDARY?
  1167.         JZ      LPR60           ; IF SO CONTINUE SCAN
  1168.         JMP     LPR45           ; ITS A START
  1169.  
  1170. DO_WHILE:
  1171.         CMP     SP,BP           ; ANY PUSHED ADDRESSES?
  1172.         JAE     LPRRET          ; SP=BP MEANS NO WORK PENDING
  1173.                                 ; SP>BP MEANS TROUBLE
  1174.         CALL    LOPAINTR        ; RESOLVE STACKED RIGHT ADDRESSES
  1175.         JMP     DO_WHILE        ; THEN CHECK AGAIN
  1176.  
  1177. LPRRET:
  1178.         POP     BP              ; RECOVER LAST FRAME
  1179.         RET     2               ; DISCARD DATA
  1180.  
  1181. LOPAINTR        ENDP
  1182.  
  1183. RANDOM  PROC    NEAR
  1184. ; RETURN RANDOM NUMBER FROM 1 TO AX
  1185. ; AX CHANGED TO RANDOM, OTHER REGS. PRESERVED
  1186.  
  1187.         PUSH    DX
  1188.         PUSH    CX
  1189.         PUSH    BX
  1190.         PUSH    AX              ; RND REQUEST
  1191.  
  1192.         CALL    RN1             ; AX HAS SEED
  1193.         POP     CX              ; GET BACK REQUEST
  1194.         MOV     DX,0            ; ONLY 16 BIT
  1195.         IDIV    CX              ; DIVIDE
  1196.         XCHG    AX,DX           ; JUST WANT REMAINDER
  1197.         INC     AX              ; 1 TO AX
  1198.         POP     BX
  1199.         POP     CX
  1200.         POP     DX
  1201.  
  1202.         RET                     ; BACK TO CALLER
  1203.  
  1204. RN1:
  1205.         MOV     AX,CS:SEED      ; SEED @
  1206.         MOV     CX,MULT         ; MULT
  1207.         MOV     DX,0            ; CLEAR OUT MSW
  1208.         IMUL    CX              ; M*
  1209.         MOV     CX,MODULUS      ; MODULUS
  1210.         IDIV    CX              ; M/MOD
  1211.  
  1212.         MOV     CS:SEED,DX      ; SEED !
  1213.         XCHG    AX,DX           ; SET UP FOR MOD
  1214.  
  1215.         RET
  1216.  
  1217. RANDOMIZE:
  1218. ; RESEED RANDOM NUMBER GENERATOR
  1219. ; NO REGS CHANGED
  1220.         PUSH    AX
  1221.         PUSH    CX
  1222.         PUSH    DX
  1223.  
  1224.         SUB     AH,AH
  1225.         INT     1AH             ; TIME OF DAY
  1226.         SUB     DH,DH           ; DX HAS LOW WORD
  1227.         XCHG    AX,DX
  1228.         MOV     CX,100
  1229.         DIV     CL              ; ONLY 8 BITS NEEDED
  1230.         MOV     CL,AH           ; GET REMAINDER
  1231.         INC     CX
  1232.  
  1233. RN2:
  1234.         PUSH    CX
  1235.         CALL    RN1
  1236.         POP     CX
  1237.  
  1238.         LOOP    RN2
  1239.  
  1240.         POP     DX
  1241.         POP     CX
  1242.         POP     AX
  1243.  
  1244.         RET
  1245.  
  1246. RANDOM  ENDP
  1247.  
  1248. LETTER  PROC    NEAR
  1249. ; PRINTS LETTER IN AL WITH COLOR IN AH
  1250. ; AT LOCATION SPECIED IN DL,DH
  1251. ; THERE ARE 12 LINES OF 20 CHARACTERS,
  1252. ; DH = ROW = 0-11, DL = COL = 0-19.
  1253.  
  1254. ; FIRST CALCULATE SCREEN POSITION FOR TOP LEFT DOT.
  1255. ; TRANSLATE DX TO SCREEN COORDINATES.
  1256.  
  1257. ; THIS IS FAST VERSION, ONLY SETS DOTS THAT ARE ON.
  1258. ; USE SLOWLETTER FOR BACKGROUND OTHER THAN CURRENT.
  1259.  
  1260.         PUSH    DS      ; ONLY AX LOST
  1261.         PUSH    SI
  1262.         PUSH    DX
  1263.         PUSH    CX
  1264.         PUSH    BX
  1265.  
  1266.         PUSH    AX      ; SAVE LETTER AND COLOR
  1267.         MOV     AL,DH   ; ROW
  1268.         CBW
  1269.         SHL     AX,1
  1270.         SHL     AX,1    ; 8 DOTS VERTICLE AND HORIZONTAL
  1271.         SHL     AX,1    ; TIMES ROWS
  1272.         MOV     DH,AL   ; STORE SCREEN POS. IN DH - 8 BITS OK
  1273.         MOV     AL,DL   ; COL
  1274.         CBW
  1275.         SHL     AX,1
  1276.         SHL     AX,1
  1277.         SHL     AX,1    ; FOR COLUMNS
  1278.         MOV     DL,AL   ; STORE SCREEN POS. IN DL
  1279.         MOV     AX,0F000H
  1280.         MOV     DS,AX   ; ROM TABLE
  1281.         MOV     SI,ROM_TABLE_ADDRESS
  1282.         POP     CX      ; GET BACK LETTER AND COLOR
  1283.         MOV     AL,CL   ; 8 BYTES PER CHARACTER
  1284.         CBW
  1285.         SHL     AX,1
  1286.         SHL     AX,1
  1287.         SHL     AX,1    ; TIMES CHARACTER
  1288.         ADD     SI,AX   ; OFFSET INTO TABLE
  1289.         MOV     AL,CH   ; COLOR
  1290.         MOV     BL,CH   ; STORE HERE TOO
  1291.         MOV     CX,8    ; EIGHT SHOWS UP A LOT
  1292.  
  1293. LET1:
  1294.         PUSH    DX      ; SAVE SCREEN POS.
  1295.         MOV     AH,[SI] ; GET BIT-PATTERN
  1296.         MOV     BH,80H  ; MASK
  1297.  
  1298.  
  1299. LET2:
  1300.         TEST    AH,BH   ; CHECK FOR DOT
  1301.         JZ      LET4    ; IF NO DOT SKIP
  1302.  
  1303. LET3:
  1304.         PUSH    DX
  1305.         PUSH    CX
  1306.         MOV     CL,DL   ; COL
  1307.         MOV     CH,0
  1308.         MOV     DL,DH   ; ROW
  1309.         MOV     DH,0
  1310.         CALL    PLOTDOT
  1311.         POP     CX
  1312.         POP     DX
  1313.  
  1314. LET4:
  1315.         SHR     BH,1    ; MASK
  1316.         JC      LET5    ; WHEN BIT DROPS OUT WE'RE DONE
  1317.         INC     DL      ; SET TO NEXT DOT TO RIGHT
  1318.         JMP     LET2
  1319.  
  1320. LET5:
  1321.         POP     DX      ; GET BACK ORIG.
  1322.         INC     DH      ; SET TO NEXT ROW.
  1323.         INC     SI      ; SET TO NEXT BYTE.
  1324.  
  1325.         LOOP    LET1    ; DO FOR WHOLE MATRIX (8X8)
  1326.  
  1327.         POP     BX      ; RESTORE REGS.
  1328.         POP     CX
  1329.         POP     DX
  1330.         POP     SI
  1331.         POP     DS
  1332.  
  1333.         RET             ; BACK TO CALLER
  1334.  
  1335. LETTER  ENDP
  1336.  
  1337.  
  1338. SLOWLETTER  PROC    NEAR
  1339. ; PRINTS LETTER IN AL WITH COLOR IN AH
  1340. ; AT LOCATION SPECIED IN DL,DH
  1341. ; THERE ARE 12 LINES OF 20 CHARACTERS,
  1342. ; DH = ROW = 0-11, DL = COL = 0-19.
  1343.  
  1344. ; FIRST CALCULATE SCREEN POSITION FOR TOP LEFT DOT.
  1345. ; TRANSLATE DX TO SCREEN COORDINATES.
  1346.  
  1347.         PUSH    DS      ; ONLY AX LOST
  1348.         PUSH    SI
  1349.         PUSH    DX
  1350.         PUSH    CX
  1351.         PUSH    BX
  1352.  
  1353.         PUSH    AX      ; SAVE LETTER AND COLOR
  1354.         MOV     AL,DH   ; ROW
  1355.         CBW
  1356.         SHL     AX,1
  1357.         SHL     AX,1    ; 8 DOTS VERTICLE AND HORIZONTAL
  1358.         SHL     AX,1    ; TIMES ROWS
  1359.         MOV     DH,AL   ; STORE SCREEN POS. IN DH - 8 BITS OK
  1360.         MOV     AL,DL   ; COL
  1361.         CBW
  1362.         SHL     AX,1
  1363.         SHL     AX,1
  1364.         SHL     AX,1    ; FOR COLUMNS
  1365.         MOV     DL,AL   ; STORE SCREEN POS. IN DL
  1366.         MOV     AX,0F000H
  1367.         MOV     DS,AX   ; ROM TABLE
  1368.         MOV     SI,ROM_TABLE_ADDRESS
  1369.         POP     CX      ; GET BACK LETTER AND COLOR
  1370.         MOV     AL,CL   ; 8 BYTES PER CHARACTER
  1371.         CBW
  1372.         SHL     AX,1
  1373.         SHL     AX,1
  1374.         SHL     AX,1    ; TIMES CHARACTER
  1375.         ADD     SI,AX   ; OFFSET INTO TABLE
  1376.         MOV     AL,CH   ; COLOR
  1377.         MOV     BL,CH   ; STORE HERE TOO
  1378.         MOV     CX,8    ; EIGHT SHOWS UP A LOT
  1379.  
  1380. SLET1:
  1381.         PUSH    DX      ; SAVE SCREEN POS.
  1382.         MOV     AH,[SI] ; GET BIT-PATTERN
  1383.         MOV     BH,80H  ; MASK
  1384.  
  1385.  
  1386. SLET2:
  1387.         TEST    AH,BH   ; CHECK FOR DOT
  1388.         JNZ     SLET3   ; IF DOT SKIP
  1389.         PUSH    DX      ; CODE HERE WILL SET BLACK DOTS
  1390.         PUSH    CX      ; IN SPACE WHERE THERE SHOULD BE NO DOTS.
  1391.         CALL    BGRND   ; GET BACKGROUND COLOR FOR PLOTDOT
  1392.         MOV     CL,DL   ; COL
  1393.         SUB     CH,CH
  1394.         MOV     DL,DH   ; ROW
  1395.         SUB     DH,DH
  1396.         CALL    PLOTDOT ; SET TO BLACK
  1397.         POP     CX
  1398.         POP     DX
  1399.         MOV     AL,BL   ; GET BACK COLOR
  1400.         JMP     SLET4
  1401.  
  1402. SLET3:
  1403.         PUSH    DX
  1404.         PUSH    CX
  1405.         MOV     CL,DL   ; COL
  1406.         SUB     CH,CH
  1407.         MOV     DL,DH   ; ROW
  1408.         SUB     DH,DH
  1409.         CALL    PLOTDOT
  1410.         POP     CX
  1411.         POP     DX
  1412.  
  1413. SLET4:
  1414.         SHR     BH,1    ; MASK
  1415.         JC      SLET5   ; WHEN BIT DROPS OUT WE'RE DONE
  1416.         INC     DL      ; SET TO NEXT DOT TO RIGHT
  1417.         JMP     SLET2
  1418.  
  1419. SLET5:
  1420.         POP     DX      ; GET BACK ORIG.
  1421.         INC     DH      ; SET TO NEXT ROW.
  1422.         INC     SI      ; SET TO NEXT BYTE.
  1423.  
  1424.         LOOP    SLET1   ; DO FOR WHOLE MATRIX (8X8)
  1425.  
  1426.         POP     BX      ; RESTORE REGS.
  1427.         POP     CX
  1428.         POP     DX
  1429.         POP     SI
  1430.         POP     DS
  1431.  
  1432.         RET             ; BACK TO CALLER
  1433.  
  1434. BGRND:
  1435. ; MAKE A BACKGROUND OUT OF AL, ACCOUNT FOR XOR
  1436.         TEST    AL,80H
  1437.         JNZ     BGRND1
  1438.         SHR     AL,1
  1439.         SHR     AL,1
  1440.         SHR     AL,1
  1441.         SHR     AL,1    ; MOVE TO FOREGROUND DOT
  1442.  
  1443.         RET
  1444.  
  1445. BGRND1:
  1446.         SHR     AL,1
  1447.         SHR     AL,1
  1448.         SHR     AL,1
  1449.         SHR     AL,1
  1450.         OR      AL,80H
  1451.  
  1452.         RET
  1453.  
  1454. SLOWLETTER  ENDP
  1455.  
  1456. LOPRINT PROC    NEAR
  1457. ; PRINT A BASIC STRING - CX HAS LENGTH.
  1458. ; AT DH=ROW, DL=COL, AH=COLOR, DS:SI POINT TO STRING
  1459. ; RETURNS WITH DH,DL CONTAINING NEXT LOCATE POSITION
  1460. ; AX, SI, CX, DX CHANGED. OTHERS OK.
  1461.  
  1462.         CMP     DH,11
  1463.         JA      LOPRET  ; REJECT OUT OF RANGE
  1464.         CMP     DL,19
  1465.         JA      LOPRET
  1466.         OR      CX,CX   ; EOS?
  1467.         JZ      LOPRET
  1468.         TEST    AH,0F0H ; USING BACKGROUNDS?
  1469.         JNZ     LOP3
  1470.  
  1471. LOP1:
  1472.         MOV     AL,[SI] ; GET CHAR
  1473.         CMP     AL,13   ; CR?
  1474.         JZ      LOP1C
  1475.         CMP     AL,8    ; BS?
  1476.         JNZ     LOP1B
  1477.         CALL    BACK_SPACE
  1478.         JMP     SHORT LOP2
  1479. LOP1B:
  1480.         PUSH    AX      ; COLOR SAVE
  1481.         CALL    LETTER
  1482.         POP     AX
  1483.  
  1484.         INC     DL
  1485.         CMP     DL,20   ; TOO FAR OVER?
  1486.         JNZ     LOP2
  1487. LOP1C:
  1488.         INC     DH
  1489.         CMP     DH,12   ; TOO FAR DOWN?
  1490.         JNZ     LOP1A   ; SCROLL SCREEN
  1491.         CALL    LOSCROLL
  1492.         MOV     DH,11
  1493. LOP1A:
  1494.         MOV     DL,0    ; SET TO START OF NEXT LINE
  1495.  
  1496. LOP2:
  1497.         INC     SI
  1498.  
  1499.         LOOP    LOP1
  1500.  
  1501. LOPRET:
  1502.         RET
  1503.  
  1504. LOP3:
  1505.         MOV     AL,[SI] ; GET CHAR
  1506.         CMP     AL,13   ; CR?
  1507.         JZ      LOP3C
  1508.         CMP     AL,8    ; BS?
  1509.         JNZ     LOP3B
  1510.         CALL    BACK_SPACE
  1511.         JMP     SHORT LOP4
  1512. LOP3B:
  1513.  
  1514.         PUSH    AX      ; COLOR SAVE
  1515.         CALL    SLOWLETTER
  1516.         POP     AX
  1517.  
  1518.         INC     DL
  1519.         CMP     DL,20   ; TOO FAR OVER?
  1520.         JNZ     LOP4
  1521. LOP3C:
  1522.         INC     DH
  1523.         CMP     DH,12   ; TOO FAR DOWN?
  1524.         JNZ     LOP3A   ; SCROLL SCREEN
  1525.         CALL    LOSCROLL
  1526.         MOV     DH,11
  1527. LOP3A:
  1528.         MOV     DL,0    ; SET TO START OF NEXT LINE
  1529.  
  1530. LOP4:
  1531.         INC     SI
  1532.         LOOP    LOP3
  1533.         JMP     LOPRET
  1534.  
  1535. LOPRINT ENDP
  1536.  
  1537. BACK_SPACE      PROC    NEAR
  1538.         PUSH    AX
  1539.         PUSH    CX
  1540.         OR      DL,DL   ; AT FIRST COL?
  1541.         JNZ     BS1
  1542.         OR      DH,DH   ; AT FIRST ROW?
  1543.         JZ      BSRET   ; NOTHING TO DO.
  1544.         DEC     DH      ; ELSE SET TO ONE ROW UP
  1545.         MOV     DL,20   ; AND LAST COL+1
  1546.  
  1547. BS1:
  1548.         DEC     DL      ; ONE SPACE BACK
  1549.         MOV     AL,' '  ; MAKE A SPACE
  1550.         MOV     AH,CS:LOCOLOR   ; BACKGROUND COLOR
  1551.         MOV     CL,4    ; MOVE TO BKGRND
  1552.         SHL     AH,CL
  1553.         CALL    SLOWLETTER      ; MAKE IT
  1554.  
  1555. BSRET:
  1556.         POP     CX
  1557.       TE<P     AX
  1558.         RET
  1559.  
  1560. BACK_SPACE      ENDP
  1561.  
  1562. LOS}ICROLL      PROC    NEAR
  1563. ; SCROLL LORES SCREEN 1 ROW, US]IeQ~BW7->K\K\{}i{_S7E VALUE IN LOCOLOR FOR BHLANK ROW
  1564.         PUSH    AX
  1565.         PUSH    BX
  1566.         PUSH    CX
  1567.         PUSH    DX
  1568.         PUSH    SI
  1569.  
  1570.         PUSH    DS
  1571.         PUSH    ES
  1572.         POP     DS      ; ES,DS POINT TO VIDEO
  1573.         MOV     SI,1280 ; ROW 1, COL 0
  1574.         MOV     DI,0    ; ROW 0, COL 0
  1575.         MOV     CX,14720 ; 160 BYTES/ROW * 92 ROWS
  1576.  
  1577.         MOV     DX,MODE
  1578.         MOV     AL,1
  1579.         OUT     DX,AL   ; TURN OFF VIDEO OR IT WILL START SNOWING
  1580.  
  1581.         CLD
  1582.         REP     MOVSB   ; DO SCROLL
  1583.         MOV     AH,CS:LOCOLOR   ; USE LAST CLS OR INIT FOR BLANK LINE
  1584.         AND     AH,0FH  ;
  1585.         MOV     BL,AH
  1586.         MOV     CL,4
  1587.         SHL     BL,CL   ; MOVE COLOR INTO BOTH HALVES OF ATTRIBUTE
  1588.         OR      AH,BL   ; COMBINE
  1589.         MOV     AL,0DEH ; CHAR 222
  1590.         MOV     DI,14080 ; ROW 88, COL 0
  1591.         MOV     CX,960
  1592.         CLD
  1593.         REP     STOSW   ; STORE AX IN SCREEN[DI]
  1594.  
  1595.         MOV     DX,MODE
  1596.         MOV     AL,9
  1597.         OUT     DX,AL   ; TURN ON VIDEO
  1598.  
  1599.         POP     DS      ; GET BACK BASIC INFO
  1600.  
  1601.         POP     SI
  1602.         POP     DX
  1603.         POP     CX
  1604.         POP     BX
  1605.         POP     AX
  1606.         RET
  1607.  
  1608. LOSCROLL        ENDP
  1609.  
  1610. ; TRIG LOOKUP FUNCTIONS
  1611. ; FROM DR. DOBBS - OCT. 82 P.53
  1612. ; BY RAY DUNCAN FROM PUBLIC DOMAIN FORTH
  1613. ; PROGRAM BY JOHN JAMES
  1614.  
  1615. TRIG_LOOKUP     PROC    NEAR
  1616.  
  1617. TRIG:
  1618.         MOV     BX,AX
  1619.         CMP     BX,90
  1620.         JLE     TRIG1
  1621.         SUB     BX,180
  1622.         NEG     BX
  1623.  
  1624. TRIG1:
  1625.         SAL     BX,1
  1626.         MOV     AX,CS:SINTBL[BX]
  1627.         RET
  1628.  
  1629. COS:
  1630.         ADD     AX,90
  1631.  
  1632. SIN:
  1633.         PUSH    DX
  1634.         PUSH    BX
  1635.         CWD
  1636.         MOV     BX,360
  1637.         IDIV    BX
  1638.         MOV     AX,DX
  1639.         OR      AX,AX
  1640.         JNS     SIN2
  1641.         ADD     AX,360
  1642.  
  1643. SIN2:
  1644.         CMP     AX,180
  1645.         JLE     SIN3
  1646.         SUB     AX,180
  1647.         CALL    TRIG
  1648.  
  1649.         NEG     AX
  1650.         JMP     SIN4
  1651.  
  1652. SIN3:
  1653.         CALL    TRIG
  1654.  
  1655. SIN4:
  1656.         POP     BX
  1657.         POP     DX
  1658.         RET             ; TO CALLER
  1659.  
  1660. SINTBL  DW      0       ; 0 DEGREES
  1661.         DW      175
  1662.         DW      349
  1663.         DW      523
  1664.         DW      698
  1665.         DW      872
  1666.         DW      1045
  1667.         DW      1219
  1668.         DW      1392
  1669.         DW      1564
  1670.         DW      1736    ; 10
  1671.         DW      1908
  1672.         DW      2079
  1673.         DW      2250
  1674.         DW      2419
  1675.         DW      2588
  1676.         DW      2756
  1677.         DW      2924
  1678.         DW      3090
  1679.         DW      3256
  1680.         DW      3420    ; 20
  1681.         DW      3584
  1682.         DW      3746
  1683.         DW      3907
  1684.         DW      4067
  1685.         DW      4226
  1686.         DW      4384
  1687.         DW      4540
  1688.         DW      4695
  1689.         DW      4848
  1690.         DW      5000    ; 30
  1691.         DW      5150
  1692.         DW      5299
  1693.         DW      5446
  1694.         DW      5592
  1695.         DW      5736
  1696.         DW      5878
  1697.         DW      6018
  1698.         DW      6157
  1699.         DW      6293
  1700.         DW      6428    ; 40
  1701.         DW      6561
  1702.         DW      6691
  1703.         DW      6820
  1704.         DW      6947
  1705.         DW      7071
  1706.         DW      7193
  1707.         DW      7314
  1708.         DW      7431
  1709.         DW      7547
  1710.         DW      7660    ; 50
  1711.         DW      7771
  1712.         DW      7880
  1713.         DW      7986
  1714.         DW      8090
  1715.         DW      8192
  1716.         DW      8290
  1717.         DW      8387
  1718.         DW      8480
  1719.         DW      8572
  1720.         DW      8660    ; 60
  1721.         DW      8746
  1722.         DW      8829
  1723.         DW      8910
  1724.         DW      8988
  1725.         DW      9063
  1726.         DW      9135
  1727.         DW      9205
  1728.         DW      9272
  1729.         DW      9336
  1730.         DW      9397    ; 70
  1731.         DW      9455
  1732.         DW      9511
  1733.         DW      9563
  1734.         DW      9613
  1735.         DW      9659
  1736.         DW      9703
  1737.         DW      9744
  1738.         DW      9781
  1739.         DW      9816
  1740.         DW      9848    ; 80
  1741.         DW      9877
  1742.         DW      9903
  1743.         DW      9925
  1744.         DW      9945
  1745.         DW      9962
  1746.         DW      9976
  1747.         DW      9986
  1748.         DW      9994
  1749.         DW      9998
  1750.         DW      10000   ; 90
  1751.  
  1752. TRIG_LOOKUP     ENDP
  1753.  
  1754. LASTWORD        DB      0
  1755.  
  1756. CSEG    ENDS
  1757.         END
  1758. 
  1759.  
  1760.  
  1761. PRESS ENTER TO CONTINUE: 0000   ; 90
  1762.  
  1763. TRIG_LOOKUP